/*
 * @Description: enter your description
 * @Autor: 帅ZR帅
 * @Date: 2023-10-08 11:18:49
 * @LastEditors: 帅ZR帅
 * @LastEditTime: 2023-11-30 09:25:35
 */
#ifndef _OLED_H_
#define _OLED_H_
#include <Arduino.h>
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "Bluetooth.h"
#include <U8g2lib.h>
#include "TAU1202.h"
#include "CAM.h"

extern uint64_t key;
extern int times_test;
// uint8_t key_per[8];
// uint8_t mac_per[8];

// key_per[0] = key & 0x01;
// key_per[1] = key & 0x31;
// key_per[2] = key & 0x61;
// key_per[3] = key & 0x91;
// key_per[4] = key & 0x121;
// key_per[5] = key & 0x151;
// key_per[6] = key & 0x181;
// key_per[7] = key & 0x211;

// mac_per[0] = mac & 0x01;
// mac_per[1] = mac & 0x31;
// mac_per[2] = mac & 0x61;
// mac_per[3] = mac & 0x91;
// mac_per[4] = mac & 0x121;
// mac_per[5] = mac & 0x151;
// mac_per[6] = mac & 0x181;
// mac_per[7] = mac & 0x211;

int64_t ID1(void);
int64_t ID0(void);
// extern U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2;
extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
//**************************************OLED模块**************************************************//
extern int MCU_OLED; // OLED 电源使能 高电平有效(输出)
extern int OLED_SCL;
extern int OLED_SDA;
//**************************************OLED模块**************************************************//

extern int MCU_BEEP;

//****************************************按键&&电量**********************************************//
extern int BAT_ADC;  // 电池电压采样(ADC)
extern int KEY_ADC;  // 多功能按键(ADC)
extern int TRIG_KEY; // 扫描触发 下拉输入 高电平触发 (外部中断)
extern int USB_D_F;  // USB 数据－
extern int USB_D_Z;  // USB 数据＋
//****************************************按键&&电量********************************************//

//******************************************TEXT****************************************************//
typedef struct
{
    const char *str;
    byte len;
    int data;
} SETTING_LIST;

extern SETTING_LIST oled_list[];
extern SETTING_LIST ir_list[];
extern SETTING_LIST rfid_list[];
extern SETTING_LIST cam_list[];
extern SETTING_LIST sys_list[];
//******************************************TEXT****************************************************//

//****************************************菜单**************************************************//
typedef struct xMenu_Item
{
    uint8_t Menu_Num;
    void (*Menu_Title)(void);         // 菜单标题
    void (*Menu_Function)(void);      // 菜单函数
    struct xMenu_Item *Previous_Menu; // 父级菜单
    struct xMenu_Item *Next_Menu;     // 子级菜单
} xMenu_Item;

// 运行菜单
typedef struct xRuning_Menu
{
    struct xMenu_Item *Menu_Item;
} xRuning_Menu;
// 扫码模式
extern uint8_t scan_mode;    // 0 红外 1 RFID 2 CAM
extern uint8_t key_value;    // 按键值
extern xMenu_Item Menu_Null; // 空白菜单
//****************************************菜单**************************************************//
extern uint8_t IR_Flag;
extern uint8_t RFID_Flag;
extern uint8_t CAM_Flag;
extern uint8_t GPS_Flag;

extern char scan_data_1[256];
extern char scan_data_2[256];

extern int data;
extern uint8_t OLED_Light;
//****************************************扫码标志位*********************************************//
void OLED_Init(void);
void Menu_Title(void);    // 菜单不需要刷新的部分只显示一次就可以了 比如标题 节约资源
void Menu_Function(void); // 菜单需要一直刷新的部分 比如变化的数据
void message_bar(void);   // 消息栏
void Key_Scan(void);      // 按键扫描
#endif                    // !OLED_H_